group by 子句,分组查询
----------------
对查询结果(已经通过where子句过滤之后的数据),按照某个字段,进行分组!
group by 字段!
在分组的结果中,只会显示组内的头一条记录!因此,通常,分组之后的数据,除 了分组的字段外,其他字段的逻辑含义很轻!
分组的作用,不在查询每个组内的具体数据。而其作用主要是在分组统计上:
### 合计函数
此时需要使用 统计函数(合计函数)加以配合!
合计函数例如:count() 可以统计结果中的记录数,但是一旦使用了分组查询,则只会统计组内的数据!
count(),统计记录数。典型的使用是 count(\*),但是除了\*之外,是可以使用字段名的!
其中,只要记录存在,则count(\*)就会统计到数据,而如果相应的字段为null,则count(字段)不会统计上数据:
看下面对 gender 的统计结果:
sum(字段表达式),统计和,对某个字段求和!
avg(),平均值
max(字段表达式),最大值
min(字段表达式),最小值
group\_concat(字段表达式),组内连接字符串
### 分组排序
默认的分组后会按照 分组字段对结果进行排序。可以group by子句指定排序的方式(升序ASC和降序DESC)
### 多字段分组
使用逗号分隔开多个分组字段即可!统计时,会按照多个字段的组合分组生成结果!
例如:统计每个班级内的 男生和女生的数量!
如果是多字段分组,需要查看每个分组的的详细情况:
可以使用 关键字 with rollup 关键字来回滚统计:
having子句,条件子句
-------------
功能上与where类似,都是条件子句!
主要的区别,在于执行时机:
执行时机:
where,是开始时,从数据源中检索数据的条件。
而 having,是在筛选,分组之后,在得到的结果中,再次进行筛选的语法!
因此 having的结果 一定是 where 已经 过滤之后的结果!
having的作用在于,对结果进行二次处理!
例如:找到 平均身高 高于 175cm的 班级:
每个班级的平均身高:
查询条件是 avg(height)之后的结果:
此时,where和groupby已经执行结束!可以使用 having 进行二次过滤:
为啥要有 having:where没有办法与 合计函数一起使用!原因在于执行 顺序问题!
典型的应该使用别的形式为 having完成条件表达式:
order by 排序子句
-------------
对结果进行排序的语句!
order by 字段名 [asc|desc], [字段名 [asc|desc],]
可见 可按照多个字段进行排序
原则是,先按照第一个字段进行排序,如果字段值相同,则采用第二个,以此类推!
limit 子句
--------
限制 结果记录数的子句!
从 所有的结果中 ,选择部分结果的 子句!
上面的是记录的位置:
可以从 某个位置开始,取得多少条!
limit start, size;
start:起始位置
size,取得的记录数
注意,第二个参数是,长度,而不是 终止位置!
还有一个简写,省略start起始位置,表示从第一条记录开始:
分页!
select的子句的总结
------------
select子句的全部子句
### 书写 顺序
字段表达式,from子句,where子句,group by子句,having子句,order by子句,limit子句。
书写顺序,与 执行顺序!几乎是一样的!
### 执行顺序
from
where
group by
字段表达式,合计函数表达式
having
order by
limit
书写顺序不能错,但是子句几乎都可以省略!省略表示不发生操作!
![](FBE9DDCE204999C9798D9E646DB0DE29.png)
上一篇: [20 子查询,sub-query](http://arick.leanote.com/post/20-%E5%AD%90%E6%9F%A5%E8%AF%A2%EF%BC%8Csub-query)